package day14;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;

import static java.util.concurrent.Executors.*;

/**
 * @author Xiao
 * @date 2021/8/7
 */
public class ThreadPoolDemo01 {
    /**
     * ①创建一个池子，池子中是空的：创建Executors中的静态方法。
     * 	static ExecutorService newCachedThreadPool()：创建一个根据需要创建新线程的线程池，但在可用时将重新使用以前构造的线程（创建默认的线程池对象）。
     * 	static ExecutorService newFixedThreadPool(int nThreads)：创建一个线程池，该线程池重用固定数量的从共享无界队列中运行的线程（创建指定最大线程数的线程池对象）。
     * 	Executor：创建线程池对象。
     * 	ExecutorService：创建线程池控制者对象，控制线程池。
     * ②有任务需要执行时，创建线程对象，任务执行完毕，线程对象归还给池子：submit方法（池子会自动的帮我们创建对象，任务执行完毕，也会自动把线程对象归还池子）。
     * 	Future<?> submit(Runnable task)：提交一个可运行的任务执行，并返回一个表示该任务的未来。
     * 	<T> Future<T>	submit(Callable<T> task)：提交值返回任务以执行，并返回代表任务待处理结果的Future。
     * ③所有的任务全部执行完毕，关闭连接池：shutdown方法。
     * 	List<Runnable> shutdownNow()：尝试停止所有主动执行的任务，停止等待任务的处理，并返回正在等待执行的任务列表。
     */
    public static void main(String[] args) {
//        method1();
        ExecutorService pool = newFixedThreadPool(10);
        ThreadPoolExecutor pool1 = (ThreadPoolExecutor) pool;
        System.out.println(pool1.getPoolSize());
        pool.submit(() -> {
            System.out.println(Thread.currentThread().getName() + "执行了");
        });
        pool.submit(() -> {
            System.out.println(Thread.currentThread().getName() + "执行了");
        });
        System.out.println(pool1.getPoolSize());
        pool.shutdown();

    }

    private static void method1() {
        ExecutorService pool = newCachedThreadPool();
        pool.submit(() -> {
            System.out.println(Thread.currentThread().getName() + "执行了");
        });
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        pool.submit(() -> {
            System.out.println(Thread.currentThread().getName() + "执行了");
        });
        pool.shutdown();
    }
}
